/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package model.dao;

import java.io.Serializable;
import java.util.List;
import org.hibernate.classic.Session;
import model.util.HibernateUtil;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Transaction;

/**
 *
 * @author DucThien
 */
public abstract class AbstractDAO<P, K extends Serializable> {
    
    protected abstract Class getPOJOClass();
    
    public P get(K key) throws HibernateException{
        Session session = HibernateUtil.getSessionFactory().openSession();
        P p = (P)session.get(getPOJOClass(),key); 
        session.close();
        return p;
    }
    
    public List<P> getList() throws HibernateException{
        Session session = HibernateUtil.getSessionFactory().openSession();
        String hql = String.format("select obj from %s obj", getPOJOClass().getName());
        Query query = session.createQuery(hql);
        List<P> list = query.list();
        return list;
    }
    
    public void saveOrUpdate(P p) throws HibernateException{
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction trans = session.beginTransaction();
        try{
            session.saveOrUpdate(p); 
            trans.commit();
        }catch(HibernateException ex){
            trans.rollback();
            throw ex;
        }finally{
            session.close();
        }
    }
    
    public void delete(P p) throws HibernateException{
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction trans = session.beginTransaction();
        try{
            session.delete(p); 
            trans.commit();
        }catch(HibernateException ex){
            trans.rollback();
            throw ex;
        }finally{
            session.close();
        }
    }
    
}
